home *** CD-ROM | disk | FTP | other *** search
/ Mission 3 / Mission 3.zip / Mission 3.iso / texte / 7up_pd / fbinfo.c < prev    next >
C/C++ Source or Header  |  1998-10-29  |  15KB  |  620 lines

  1. /* Dateiinformationen Datum, Uhrzeit ... */
  2. /*****************************************************************************
  3. *
  4. *                                                7UP
  5. *                                        Modul: FBINFO.C
  6. *                                     (c) by TheoSoft '91
  7. *
  8. *****************************************************************************/
  9. #include <portab.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <ctype.h>
  14. #include <aes.h>
  15. #include <vdi.h>
  16.  
  17. #include "alert.h"
  18.  
  19. #include "7up.h"
  20. #include "windows.h"
  21. #include "version.h"
  22. #include "macro.h"
  23.  
  24. #if GEMDOS
  25. #include <tos.h>
  26. #include <ext.h>
  27. #else
  28. #include <dir.h>
  29. #include <dos.h>
  30. #include <alloc.h>
  31. #endif
  32.  
  33. #include "language.h"
  34.  
  35. #define INFONAME_LEN 20
  36.  
  37. /* dta.h(dateistruktur) 14.04.87  */
  38.  
  39. typedef struct datetimerec
  40. {
  41. #if GEMDOS
  42.     unsigned  hr  : 5;
  43.     unsigned  min : 6;
  44.     unsigned  sec : 5;
  45.     unsigned  yr  : 7;
  46.     unsigned  mon : 4;
  47.     unsigned  day : 5;
  48. #else
  49.     unsigned  sec : 5;
  50.     unsigned  min : 6;
  51.     unsigned  hr  : 5;
  52.     unsigned  day : 5;
  53.     unsigned  mon : 4;
  54.     unsigned  yr  : 7;
  55. #endif
  56. }DATETIMEREC;
  57.  
  58. typedef struct dtarec
  59. {
  60.     char res[21];
  61.     char attr;
  62.     DATETIMEREC datim;
  63.     long size;
  64.     char filename[FILENAME_MAX];
  65. }MYDTA;
  66.  
  67. extern OBJECT *desktop,*infomenu;
  68. extern WINDOW _wind[MAXWINDOWS];
  69. extern char alertstr[256];
  70. extern int cut,topwin,nodesktop;
  71. extern long begline,endline;
  72. extern LINESTRUCT *begcut, *endcut, *blkwp;
  73.  
  74. char *split_fname(char *pathname);
  75. char *change_ext(char *name, char *ext);
  76. char *change_name(char *name, char *newname);
  77. long *get_cookie(long cookie);
  78.  
  79. char *make_newpathname(char *name, char *new)
  80. {
  81.     char *cp;
  82.     char temp[PATH_MAX];
  83.  
  84.     strcpy(temp,name);
  85.     if((cp=strrchr(temp,'\\'))!=NULL || (cp=strrchr(temp,'/'))!=NULL)
  86.     {
  87.         *(cp+1)=0;
  88.         strcat(temp,new);
  89.         strcpy(new,temp);
  90.     }
  91.     return(new);
  92. }
  93.  
  94. static char *make_infoname(char *filename, int mode)
  95. {
  96.    register int i,k;
  97.     char temp[FILENAME_MAX];
  98.  
  99.    if(mode)               /* TRUE = komprimieren */
  100.    {
  101.       k=strlen(filename);
  102.       for(i=k; i<12; i++)
  103.          filename[i]=0;
  104.       strncpy(temp,filename,8);
  105.       temp[8]=0;
  106.       for(i=0; i<8; i++)
  107.          if(temp[i]==' ')
  108.             temp[i]=0;
  109.       if(filename[8] && filename[8]!=' ')
  110.       {
  111.          strcat(temp,".");
  112.          filename[11]=0;
  113.          strcat(temp,&filename[8]);
  114.       }
  115.       for(i=0; i<12; i++)
  116.          if(temp[i]==' ')
  117.             temp[i]=0;
  118.       temp[12]=0;
  119.       strcpy(filename,temp);
  120.    }
  121.    else                  /* FALSE = expandieren */
  122.    {
  123.       k=strlen(filename);
  124.         for(i=0; i<9; i++)
  125.          if(filename[i] && filename[i]=='.')
  126.          {
  127.             filename[i]=0;
  128.                 break;
  129.          }
  130.         if(k>i && filename[i+1] && filename[i+1]!=' ')
  131.       {
  132.          sprintf(temp,"%-8s%-3s",filename,&filename[i+1]);
  133.          strcpy(filename,temp);
  134.          for(i=9; i<12; i++)
  135.             if(filename[i]==' ')
  136.                filename[i]=0;
  137.       }
  138.    }
  139. }
  140. /*
  141. long myMxalloc(long a, int b)
  142. {
  143. #if GEMDOS
  144.     return((long)Mxalloc(a,b));
  145. #else
  146.     return(0L);
  147. #endif
  148. }
  149. */
  150. void hndl_fileinfo(WINDOW *wp, WINDOW *blkwp)
  151. {
  152.     register LINESTRUCT *line;
  153.     char *cp,filename[FILENAME_MAX];
  154.     long lines,chars,frei;
  155.     struct ffblk fileRec;
  156.     MYDTA mydta;
  157.     int hfirst=0;
  158.  
  159. #if GEMDOS
  160.     DISKINFO dtable;
  161.     long tt_ram;
  162. #else
  163.     struct dfree dtable;
  164. #endif
  165.     int exit_obj,maxlen=0,x,y,w,h,i,k,count,do_blink=TRUE;
  166.     extern int countdeletedfiles,zz;
  167.  
  168.     if(wp && !is_selected(desktop,DESKICN1,DESKICND))
  169.     {
  170.         i=wp->icon;
  171.         sel_icons(desktop,i,i,TRUE);
  172.         do_blink=FALSE;
  173.     }
  174.     if(nodesktop)
  175.         goto NODESKTOP;
  176.     for(i=DESKICN1; i<=DESKICND; i++)
  177.     {
  178.         if(desktop[i].ob_state & SELECTED)
  179.         {
  180.             wp=Wicon(i);                        /* nimm Icon für Info */
  181.             if(do_blink)
  182.             {
  183.                 desel_icons(desktop,i,i,TRUE);          /* 3 x blinken lassen */
  184.                 evnt_timer(125,0);
  185.                 sel_icons(desktop,i,i,TRUE);
  186.                 evnt_timer(125,0);
  187.                 desel_icons(desktop,i,i,TRUE);
  188.                 evnt_timer(125,0);
  189.                 sel_icons(desktop,i,i,TRUE);
  190.             }
  191.             switch(i)
  192.             {
  193.                 case DESKICN1:
  194.                 case DESKICN2:
  195.                 case DESKICN3:
  196.                 case DESKICN4:
  197.                 case DESKICN5:
  198.                 case DESKICN6:
  199.                 case DESKICN7:
  200. NODESKTOP:
  201.                     if(wp && wp->fstr)
  202.                     {
  203.                         if(wp==blkwp && topwin && !cut && begcut && endcut)
  204.                         {
  205.                             form_write(infomenu,INFOTITL,BLOCKINFO,FALSE);
  206.                             Wblksize(wp,begcut,endcut,&lines,&chars);
  207.                         }
  208.                         else
  209.                             Wtxtsize(wp,&lines,&chars);
  210.  
  211. /* Dateiname TOS und MiNTversion */
  212.                         if(get_cookie('MiNT'))
  213.                         {
  214.                             infomenu[INFOTNAME].ob_flags|=HIDETREE;
  215.                             infomenu[INFOTNAME].ob_flags&=~EDITABLE;
  216.                             infomenu[INFOMNAME].ob_flags&=~HIDETREE;
  217.                             strcpy(filename,split_fname((char *)Wname(wp)));
  218.                             if(strlen(filename)>INFONAME_LEN)
  219.                             {
  220.                                 infomenu[INFOZUR  ].ob_flags&=~HIDETREE;
  221.                                 infomenu[INFOVOR  ].ob_flags&=~HIDETREE;
  222.                             }
  223.                             else
  224.                             {
  225.                                 infomenu[INFOZUR  ].ob_flags|=HIDETREE;
  226.                                 infomenu[INFOVOR  ].ob_flags|=HIDETREE;
  227.                             }
  228.                             strncpy(alertstr,filename,INFONAME_LEN);
  229.                             alertstr[INFONAME_LEN]=0;
  230.                             form_write(infomenu,INFOMNAME,alertstr,0);
  231.                         }
  232.                         else
  233.                         {
  234.                             infomenu[INFOTNAME].ob_flags&=~HIDETREE;
  235.                             infomenu[INFOTNAME].ob_flags|=EDITABLE;
  236.                             infomenu[INFOMNAME].ob_flags|=HIDETREE;
  237.                             infomenu[INFOZUR  ].ob_flags|=HIDETREE;
  238.                             infomenu[INFOVOR  ].ob_flags|=HIDETREE;
  239.                             strcpy(filename,split_fname((char *)Wname(wp)));
  240.                             make_infoname(filename,FALSE);
  241.                             form_write(infomenu,INFOTNAME,filename,0);
  242.                         }
  243.                         if(!findfirst((char *)Wname(wp),&mydta,0))
  244.                         {
  245.                             sprintf(alertstr,"%02d.%02d.%02d",
  246.                                 mydta.datim.day,mydta.datim.mon,mydta.datim.yr+80);
  247.                             form_write(infomenu,INFODATE,alertstr,0);
  248.                             sprintf(alertstr,"%02d:%02d:%02d",
  249.                                 mydta.datim.hr, mydta.datim.min, mydta.datim.sec*2);
  250.                             form_write(infomenu,INFOTIME,alertstr,0);
  251.                             while(!findnext(&mydta)); /* weiter bis zum Ende */
  252.                         }
  253.                         else
  254.                         {
  255.                             form_write(infomenu,INFODATE,"--.--.--",0);
  256.                             form_write(infomenu,INFOTIME,"--:--:--",0);
  257.                         }
  258. /* Editiert */
  259.                         if(wp->w_state & CHANGED)
  260.                             *(char *)infomenu[INFOEDIT].ob_spec.index='*';
  261.                         else
  262.                             *(char *)infomenu[INFOEDIT].ob_spec.index=' ';
  263. /* Zeichen */
  264.                         sprintf(alertstr,"%8ld",chars);
  265.                         form_write(infomenu,INFOSIZE,alertstr,0);
  266. /* Zeilen */
  267.                         sprintf(alertstr,"%5ld",lines);
  268.                         form_write(infomenu,INFOLINE,alertstr,0);
  269. /* Seiten */
  270.                         sprintf(alertstr,"%5ld",lines%zz ? lines/zz+1 : lines/zz);
  271.                         /* Wenn kein Divisionsrest, Seitenzahl ganzzahlig,
  272.                             andernfalls eine Seite mehr angeben */
  273.                         form_write(infomenu,INFOPAGE,alertstr,0);
  274. /* längste Zeile */
  275.                         for(line=wp->fstr; line; line=line->next)
  276.                             maxlen=max(line->used,maxlen);
  277.                         for(lines=1,line=wp->fstr; line; lines++,line=line->next)
  278.                             if(line->used==maxlen)
  279.                                 break;
  280.                         sprintf(alertstr,"%5ld/%3d",lines,maxlen);
  281.                         form_write(infomenu,INFOLONG,alertstr,0);
  282. /* in Arbeit */
  283.                         sprintf(alertstr,"%d",Wcount(CREATED));
  284.                         form_write(infomenu,INFOTOTL,alertstr,0);
  285. /* Gesamtgröβe aller Dateien */
  286.                         for(frei=0L, k=1; k<MAXWINDOWS; k++)
  287.                             if(_wind[k].w_state & CREATED)
  288.                             {
  289.                                 Wtxtsize(Wp(_wind[k].wihandle),&lines,&chars);
  290.                                 frei+=chars; /* nicht frei, aber richtiger Datentyp long */
  291.                             }
  292.                         sprintf(alertstr,"%8ld",frei);
  293.                         form_write(infomenu,INFOTBYT,alertstr,0);
  294. /* Ram */
  295. #if GEMDOS
  296.                         tt_ram=max(0,(long)Mxalloc(-1L,0)) + 
  297.                                  max(0,(long)Mxalloc(-1L,1));
  298.                         sprintf(alertstr,"%8ld",tt_ram?tt_ram:(long)Malloc(-1L));
  299. #else
  300.                         sprintf(alertstr,"%8ld",
  301.                             farcoreleft());
  302. #endif
  303.                         form_write(infomenu,INFOFRAM,alertstr,0);
  304. /* Dialog ausgeben */
  305.                         form_exopen(infomenu,0);
  306.                         do
  307.                         {
  308.                             exit_obj=(form_exdo(infomenu,0)&0x7FFF);
  309.                             switch(exit_obj)
  310.                             {
  311.                                 case INFOZUR:
  312.                                    if(hfirst>0)
  313.                                       hfirst--;
  314.                                     break;
  315.                                 case INFOVOR:
  316.                                    if(hfirst<(int)(strlen(filename)-INFONAME_LEN)) /* 20 Zeichen lang */
  317.                                        hfirst++;
  318.                                     break;
  319.                                 case INFOHELP:
  320.                                     form_alert(1,Afbinfo[0]);
  321.                                     objc_change(infomenu,exit_obj,0,infomenu->ob_x,infomenu->ob_y,infomenu->ob_width,infomenu->ob_height,infomenu[exit_obj].ob_state&~SELECTED,TRUE);
  322.                                     break;
  323.                                 
  324.                             }
  325.                             if(get_cookie('MiNT'))
  326.                             {
  327.                                 strncpy(alertstr,&filename[hfirst],INFONAME_LEN);
  328.                                 alertstr[INFONAME_LEN]=0;
  329.                                 form_write(infomenu,INFOMNAME,alertstr,TRUE);
  330.                             }
  331.                         }
  332.                         while(!(exit_obj==INFOABBR || exit_obj==INFOOK));
  333.                         form_exclose(infomenu,exit_obj,0);
  334.                         
  335.                         if(!get_cookie('MiNT') && (exit_obj==INFOOK))
  336.                         {
  337.                             form_read(infomenu,INFOTNAME,filename);
  338.                      make_infoname(filename,TRUE);
  339. /*
  340. printf("\33H%s %s",(char *)split_fname((char *)Wname(wp)),filename);
  341. */
  342.                             if(*filename && 
  343.                                *filename!=' ' && 
  344.                                strcmp((char *)split_fname((char *)Wname(wp)),
  345.                                    filename))
  346.                             {
  347.                                 if(cp=make_newpathname((char *)Wname(wp),filename))
  348.                                 {
  349.                                     wp->w_state|=CHANGED;
  350.                                     Wnewname(wp,cp);
  351.                                     ren_icon(desktop, wp->icon);
  352.                                 }
  353.                             }
  354.                         }
  355.                         form_write(infomenu,INFOTITL,DATEIINFO,FALSE);
  356.                     }
  357.                     break;
  358.                 case DESKICN8: /* Papierkorb */
  359.                 case DESKICND: /* voller Papierkorb */
  360.                     sprintf(alertstr,Afbinfo[1],countdeletedfiles);
  361.                     form_alert(1,alertstr);
  362.                     break;
  363.                 case DESKICN9: /* Drucker     */
  364.                     if(is_busy())
  365.                         form_alert(1,Afbinfo[2]);
  366.                     else
  367.                         form_alert(1,Afbinfo[3]);
  368.                     break;
  369.                 case DESKICNA: /* Diskette    */
  370.                     if(wp=Wgettop())
  371.                     {
  372.                         graf_mouse(BUSY_BEE,0L);
  373.                         cp=(char *)Wname(wp);
  374. #if GEMDOS
  375.                         Dfree(&dtable,cp[0]-'A'+1);
  376.                         frei=(long)dtable.b_free*(long)dtable.b_secsiz*(long)dtable.b_clsiz;
  377. #else
  378.                         getdfree(cp[0]-'A'+1,&dtable);
  379.                         if(dtable.df_sclus==-1)
  380.                             dtable.df_sclus=0;
  381.                         frei=(long)dtable.df_avail*(long)dtable.df_sclus*(long)dtable.df_bsec;
  382. #endif
  383.                         sprintf(alertstr,Afbinfo[4],
  384.                             (char *)split_fname((char *)Wname(wp)),frei);
  385.                         graf_mouse(ARROW,0L);
  386.                         form_alert(1,alertstr);
  387.                     }
  388.                     else
  389.                         form_alert(1,Afbinfo[5]);
  390.                     break;
  391.                 case DESKICNB: /* Klemmbrett */
  392.                     count=0;
  393.                     graf_mouse(BUSY_BEE,0L);
  394.                     scrp_read(filename);
  395.                     complete_path(filename);
  396. /*
  397.                     if(filename[strlen(filename)-1]!='\\')
  398.                         strcat(filename,"\\");
  399. */
  400.                     strcat(filename,"SCRAP.*");
  401.                     if(!findfirst(filename,&fileRec,0))
  402.                     {
  403.                         count++;
  404.                         while(!findnext(&fileRec))
  405.                             count++;
  406.                     }
  407.                     sprintf(alertstr,Afbinfo[6],count);
  408.                     graf_mouse(ARROW,0L);
  409.                     form_alert(1,alertstr);
  410.                     break;
  411.                 case DESKICNC:
  412.                     form_alert(1,Afbinfo[7]);
  413.                     break;
  414.                 default:
  415.                     break;
  416.             }
  417.             if(!do_blink)
  418.                 desel_icons(desktop,i,i,TRUE);
  419.         }
  420.     }
  421. }
  422.  
  423. void Wsetrcinfo(WINDOW *wp)
  424. {
  425.     char str[80];
  426.     int caps=FALSE;
  427.     extern int zz;
  428.     extern TMACRO macro;
  429.    extern char shortcutfile[];
  430.    
  431.     if(wp)
  432.         Wnewname(wp,(char *)Wname(wp));
  433.  
  434.     if(wp && (wp->kind&INFO))
  435.     {
  436. #if GEMDOS
  437.         caps=(int)(Kbshift(-1)&16);
  438. #else
  439.         caps=(int)(bioskey(2)&64);
  440. #endif
  441.         sprintf(str," F:%d S:%-4ld Z:%-4ld S:%-3ld L:%-3d Tab:%d U:%-3d Blk:%-4ld %c%c%c %s %s %s %s",
  442.             Windex(wp),
  443.             (wp->row+wp->hfirst/wp->hscroll)/zz+1,
  444.             wp->row+1+wp->hfirst/wp->hscroll,
  445.             wp->col+1+wp->wfirst/wp->wscroll,
  446.             wp->cstr->used,
  447.             wp->tab,
  448.             wp->umbruch,
  449.             (wp/*==blkwp*/)?(((/*begline&&*/endline)?labs(endline-begline)+(wp->w_state&COLUMN?1L:0L):0L)):0L,
  450.             wp->w_state&BLOCKSATZ?'B':' ',
  451.             wp->w_state&COLUMN?'C':' ',
  452.             wp->w_state&INDENT?'I':' ',
  453.             caps?"CAPS":"",
  454.             macro.rec ?"MREC ":"",
  455.             macro.play?"MPLAY":"",
  456.             shortcutfile);
  457.  
  458.         Wnewinfo(wp,str);
  459.     }
  460. }
  461.  
  462. static int (*cmp)(char *s, char *t)=NULL;
  463.  
  464. static int strlogcmp(register char *s, register char *t)
  465. {
  466.     register char *u=t;
  467.     do
  468.     {
  469.         while(isspace(*s))
  470.             s++;
  471.         while(isspace(*t))
  472.             t++;
  473.         if(*s != *t)
  474.             return((int)((long)t-(long)u));
  475.         s++,t++;
  476.     }
  477.     while(*s);
  478.     return(-1);
  479. }
  480.  
  481. static int strnorcmp(register char *s, register char *t)
  482. {
  483.     register char *u=t;
  484.     for(; *s == *t; s++, t++)
  485.         if(!*s)
  486.             return(-1);
  487.     return((int)((long)t-(long)u));
  488. }
  489.  
  490. static int strmcmp(char **string, int *col) /* String Multiple Compare */
  491. {
  492.     register int i,k,len,found=0;
  493.     for(i=1; i<MAXWINDOWS; i++)
  494.     {
  495.         if(string[i])
  496.             found++;
  497.     }
  498.     for(i=1; i<MAXWINDOWS; i++)
  499.     {
  500.         if(string[i])
  501.             break;
  502.     }
  503.     if(found<2)
  504.     {
  505.         *col=0;
  506.         return(-1);
  507.     }
  508.     len=strlen(string[i]);
  509.     for(k=i+1; k<MAXWINDOWS; k++)
  510.         if(_wind[k].w_state & OPENED)
  511.         {
  512.             if(string[k])
  513.             {
  514.                 if((*col=cmp(string[i],string[k]))>=0)
  515.                 {
  516. /*
  517.                     for(*col=0; *col<len; (*col)++)
  518.                         if(string[i][*col] != string[k][*col])
  519.                             break;
  520. */
  521.                     return(k);
  522.                 }
  523.             }
  524.             else
  525.             {
  526.                 *col=0;
  527.                 return(k);
  528.             }
  529.         }
  530.     return(0);
  531. }
  532.  
  533. long Wline(WINDOW *wp, LINESTRUCT *line)
  534. {
  535.     LINESTRUCT *lp;
  536.     long lc;
  537.     if(wp)
  538.     {
  539.         for(lc=0, lp=wp->fstr; lp; lc++, lp=lp->next)
  540.             if(lp==line)
  541.                 return(lc);
  542.         return(lc);
  543.     }
  544.     return(0);
  545. }
  546.  
  547. void textcompare(void)
  548. {
  549.     register int i,diff;
  550.     int col,ret,kstate;
  551.     long row;
  552.     char ascrow[33];
  553.     char *string[MAXWINDOWS];
  554.     LINESTRUCT *line[MAXWINDOWS];
  555.  
  556.     graf_mkstate(&ret, &ret, &ret, &kstate);
  557.     if(kstate & (K_RSHIFT|K_LSHIFT))
  558.         cmp=strlogcmp;          /* logischer Vergleich ohne Whitespaces */
  559.     else
  560.         cmp=strnorcmp;            /* normaler Vergleich */
  561.         
  562.     graf_mouse(BUSY_BEE,NULL);
  563.     for(i=1; i<MAXWINDOWS; i++)
  564.         if(_wind[i].w_state & OPENED)
  565.             line[i]=_wind[i].cstr;
  566.         else
  567.             line[i]=NULL;
  568.     for(i=1; i<MAXWINDOWS; i++)
  569.         if(_wind[i].w_state & OPENED)
  570.             string[i]=
  571.                 &line[i]->string[_wind[i].col-_wind[i].wfirst/_wind[i].wscroll];
  572.         else
  573.             string[i]=NULL;
  574.     while(!(diff=strmcmp(string,&col)))
  575.     {
  576.         for(i=1; i<MAXWINDOWS; i++)
  577.             if(_wind[i].w_state & OPENED)
  578.             {
  579.                 if(line[i])
  580.                     line[i]=line[i]->next;
  581.             }
  582.         for(i=1; i<MAXWINDOWS; i++)
  583.             if(_wind[i].w_state & OPENED)
  584.             {
  585.                 if(line[i])
  586.                     string[i]=line[i]->string;
  587.                 else
  588.                     string[i]=NULL;
  589.             }
  590.     }
  591.     switch(diff)
  592.     {
  593.         case -1:
  594.             form_alert(1,Afbinfo[8]);
  595.             break;
  596.         case  0:
  597.             break;
  598.         default:
  599.             sprintf(alertstr,Afbinfo[9], 
  600.                 split_fname(Wname(Wp(_wind[diff].wihandle))), 
  601.                 row=Wline(&_wind[diff],line[diff])+1, col+1);
  602.             form_alert(1,alertstr);
  603.             ltoa(row,ascrow,10);
  604.             for(i=1; i<MAXWINDOWS; i++)
  605.                 if(_wind[i].w_state & OPENED)
  606.                 {
  607.                     hndl_goto(&_wind[i],NULL,atol(ascrow));
  608.                     graf_mouse(M_OFF,NULL);
  609.                     Wcursor(&_wind[i]);
  610.                     _wind[i].col=_wind[i].cspos=col-_wind[i].wfirst/_wind[i].wscroll;
  611.                     _wind[i].cspos=Wshiftpage(&_wind[i],0,&_wind[i].cstr->used);
  612.                     Wcursor(&_wind[i]);
  613.                     graf_mouse(M_ON,NULL);
  614.                 }
  615.             Wtop(&_wind[diff]);
  616.             break;
  617.     }
  618.     graf_mouse(ARROW,NULL);
  619. }
  620.